export {};

/* 
    泛型：(理解为 JS 的函数)
    作用：把类型当做参数传递，实现代码复用的同时，保证类型的安全
    语法：
    1. <T>,小尖括号，代表是泛型，T代表要传进来的类型，传进来后，泛型里面就可以使用了
    2. 命名可以使任意合法的名字，例如 T,Type,K,建议首字母大写，一般使用T
*/
// ----------------------------------------

// 创建一个 id 函数，传入什么数据就返回该数据本身

// 方法1，每种类型写一个方法，可以解决需求，但是代码重复量太大了
const fn1 = (value: number): number => {
  return value;
};
fn1(10).toFixed();

const fn2 = (value: string): string => {
  return value;
};
fn2("str").trim();

// 方法2，联合类型，解决了代码重复问题，但是返回值无法确定
const fn3 = (value: number | string): number | string => {
  return value;
};
fn2("str").trim();

// 完美解决，泛型
const id = <T>(value: T): T => {
  return value;
};
id<number>(10).toFixed();
id<string>("str").trim();
